package cn.android666.logfilter

import java.io.File

/** 日志读取器 */
object LogReader : LineReader {

    override fun readLine(logFile: File, lineFilter: LineFilter, lineCallback: LineCallback) {
        // 用于判断是否以时间开头，时间格式为：2020_01_01 00:00:00:000
        // ^ 表示匹配开头，如果时间在字符串的中间，则不匹配，时间在字符串的开头才会进行匹配。（$符号可用来匹配结尾）
        // .* 表示匹配任意字符，即时间之后还可以包含任意字符串
        val regex = Regex("""^\d{4}_\d{2}_\d{2} \d{2}:\d{2}:\d{2}:\d{3}.*""")

        // 用于指示是否找到了需要的行
        var find = false
        NoFilterLineReader.readLine(logFile) { line ->
            val result = lineFilter.filter(line)
            if (result) {
                find = true
                lineCallback.onReadLine(line)
            } else if (regex.matches(line)) {
                // 如果一行以时间开头的，且能走到这里，说明这是新的一行日志，且不是我们需要的日志，则将find置为false
                find = false
            } else if (find) {
                // 有时候打印一个信息是一次输出多行的，但是只有第一行有时间，后面几行没有时间，所以这里需要判断一下
                // 如果之前找到了第一行，则后面的行如果没有时间的则也是需要的行
                lineCallback.onReadLine(line)
            }
        }
    }

    fun readLine(logFile: File, containText: String, lineCallback: LineCallback) {
        readLine(logFile, ContainFilter(containText), lineCallback)
    }

    fun readLineExclude(logFile: File, excludeText: String, lineCallback: LineCallback) {
        readLine(logFile, ExcludeFilter(excludeText), lineCallback)
    }

}